//原型：如果所有对象都有私有字段[[prototype]]，就是对象的原型；读一个属性，如果对象本身没有，则会继续访问对象的原型，直到原型为空或者找到为止。

//第一种构造函数
function c(){
    this.a = 1
    this.b = function(){
        console.log(this.a)
    }
}
const d = new c()
c.b()

//第二种构造函数
function c2(){
}
c2.prototype.a = 1
c2.prototype.b = function(){
    console.log(this.a)
}

const d2 = new c2()
d2.b()

//es6中构造函数，
//类的写法实际上也是由原型运行时来承载的，逻辑上 JavaScript 认为每个类是有共同原型的一组对象，类中定义的方法和属性则会被写在原型对象之上。
//然而并不是所有浏览器都支持 class/extends 关键词，不过我们可以引入 Babel 来进行转译。
class Rectangle{
    constructor(width, height){
        this.width = width
        this.height = height
    }
    //Getter
    get area(){
        this.cal()
    }
    cal(){
        return this.width * this.height
    }
}

//可以继承
class Animal{
    constructor(name){
        this.name = name
    }
    speak(){
        console.log(this.name + 'make a noise')
    }
}

class Dog extends Animal{
    constructor(name){
        super(name)
    }
    speak(){
        console.log(this.name + 'barks')
    }
}